package main

import (
	"errors"
	"fmt"
)

func check(x int) error {
	if x <= 0 {
		return errors.New("x<0")
	}
	return nil
}

func main() {
	//x:=3  go语言可以在if条件语句中创建变量并做条件判断
	/*	if x:=3;x>5 {
			fmt.Println(x)
		}else if x<5 {
			fmt.Println(x)
		}*/
	x := 20
	if err := check(x); err == nil {
		x++
		fmt.Println(x)
	} else {
		fmt.Println(err)
	}

	for i := 0; i < 4; i++ {
		if i > 3 {
			break
		}
		fmt.Println(i)
	}

	//go语言天生就支持迭代range  map：字典、channel：管道、slice：切片、array：数组
	var data [3]int = [3]int{10, 20, 30}
	//for i=0;length(data);i++{}
	for i, s := range data {
		fmt.Println(i, s)
	}
	for i := range data {
		fmt.Println(i)
		fmt.Println(data[i])
	}

	//在内部或者说闭包中，临时变量不要引用地址。结果会将之前值都被最后一个地址的值所覆盖
	data2 := [3]string{"a", "b", "c"}
	var data2Copy [3]*string //这里传递的是指针 内存地址
	//var data2Copy [3]string
	for i, s := range data2 {
		//fmt.Println(&i,&s)
		data2Copy[i] = &s
	}

	for _, s := range data2Copy {
		fmt.Println(*s)
	}

	//goto(跳转) break(终止) continue(停止当前，继续下一次)
	for i := 0; i < 4; i++ {
		fmt.Println(i)
		if i > 2 {
			goto end
			//goto test  此处goto不能跳到其不可见的函数
		}
	}
end:
	fmt.Println("end")

	testswitch()
}

func test() {
	fmt.Println("test")
}

//lesson 7
func testswitch() {
	x := 2
	a, b, c := 1, 2, 3
	switch x {
	case a:
		fmt.Println("x=a")
		//fallthrough//只能限制到下一个case（例如 case b）并不能限制一下所有case
	case b:
		fmt.Println("x=b")
	case c:
		fmt.Println("x=c")
	default:
		fmt.Println("all not equal")
	}
}
